package jmine.tec.subscription;

/**
 * Callback para o modelo de recebimento de publicacoes por 'push' ao inves de 'push'. O metodo
 * {@link #onPublication(Publisher, SubscriptionSettings, Publication)} eh chamado sempre que houver uma nova publicacao e pode ocorrer na
 * mesma thread ou em uma thread separada da que gerou a publicacao. Por ultimo, o callback pode gerenciar sua propria transacao com o banco
 * ou (recomendado) deixar com que o {@link SubscriptionManager} cuide da transacao.
 * 
 * @param <P> o tipo da publication
 */
public interface PublicationListener<P extends Publication> {

    /**
     * Se o metodo {@link #onPublication(Publisher, SubscriptionSettings, Publication)} deve ser chamado em algum contexto transacional.
     * Caso este metodo devolva <code>false</code>, o callback eh responsavel por gerenciar transacoes
     * 
     * @return boolean
     */
    boolean isTransactionRequired();

    /**
     * Se este metodo devolver <code>true</code>, o callback sera executado de modo assincrono. PublicationListeners em 'poll' podem ser
     * assincronos.
     * 
     * @return boolean
     */
    boolean isAssynchronous();

    /**
     * O metodo de callback. Os parametros {@link Publisher} e {@link SubscriptionSettings} permitem que um callback seja registrado para
     * varias {@link Subscription}
     * 
     * @param publisher {@link Publisher}
     * @param settings {@link SubscriptionSettings}
     * @param publication {@link Publication}
     */
    void onPublication(Publisher<P> publisher, SubscriptionSettings settings, P publication);

}
